part of '../writer.dart';

class FileWriterIdentity<T extends IdentityOld> extends FileWriterRawable<T>
    implements IdentityWriter<T> {
  FileWriterIdentity({
    required super.file,

    /// 由于构造函数无法作为接口，因此需要将构造函数作为单独的方程传入
    required super.unzip,
  });

  @override
  void deleteOne(String id) {
    // 尝试删除对象，如果失败了，则将错误throw出来
    bool isSuccess = deleteBy((e) => e.id == id);
    if (!isSuccess) throw BugDev("无法根据id[$id]删除对象");
  }

  @override
  T getOne(String id) => getBy((obj) => obj.id == id);

  /// 覆写很简单，但此处的挑战是不改变顺序
  @override
  void input(T object) {
    // 将所有对象深拷贝一份
    List<T> deepCopy = List.from(all);

    // 根据对象的id，尝试查找对应的index
    final int index = all.indexWhere((obj) => obj.id == object.id);
    // 根据是否找到对象执行覆写或新增操作
    if (index != -1) {
      // 如果对象已存在，则先将原来的对象清除，并在原来的位置插入新对象
      deepCopy.removeAt(index);
      deepCopy.insert(index, object);
    } else {
      // 如果对象不存在，则直接在末尾加入即可
      deepCopy.add(object);
    }

    // TODO：此步骤开始和FileWriterObject有点重复，但是不知道怎么办
    // 将对象序列化为字符串列表
    List<Json> zipped = deepCopy.map((x) => x.toJson()).toList();
    // 将json化后的列表写入到文件
    file.writeAsStringSync(jsonEncode(zipped));
  }

  @override
  T? findOne(String id) => findBy((obj) => obj.id == id);
}
